Applicative Styleの練習
from Applicative Style
問題
code:hs
do
a <- 1,2,3
b <- 4,5,6
pure (max a b)
回答: Applicative Styleの練習#64af6766198270000037b207
code:hs
do
a <- Just 1
b <- Just 2
pure (a+b)
回答: Applicative Styleの練習#64af6766198270000037b218
code:hs
do
a <- Just 1
b <- Just 2
c <- Just 3
pure $ add3 a b c
--
add3 :: Int -> Int -> Int -> Int
add3 n1 n2 n3 = n1 + n2 + n3
回答: Applicative Styleの練習#64af6766198270000037b221
code:hs
pure (+) <*> Right 10 <*> Right 20
doではなくpureを使ったものの書き換え
回答: Applicative Styleの練習#64af6766198270000037b227
code:hs
do
x <- Just 0
xs <- Just 1,2,3
pure (x:xs)
回答: Applicative Styleの練習#64af6766198270000037b22f
code:hs
do
x <- Just 5
pure x
回答: Applicative Styleの練習#64af6766198270000037b237
回答
code:hs
max <$> 1,2,3 <*> 4,5,6
最も基本的な書き換え
2つの引数を取る普通の関数に、2つのアプリカティブ値を適用している
code:hs
(+) <$> Just 1 <*> Just 2
記号だとしても同じ
code:hs
add3 <$> Just 1 <*> Just 2 <*> Just 3
引数の数が増えても同じ
<*>で連結していくだけ
code:hs
(+) <$> Right 10 <*> Right 20
pureで持ち上げてから適用するのではなく、そのまま<$>を使えば良い
code:hs
(:) <$> Just 0 <*> Just 1,2,3
consでも同じ
code:hs
(:[]) <$> Just 5
いったん以下を経由すればわかりやすい?
code:hs
do
x <- Just 5
pure (x:[])
ただ、ここで(:) x []ではなく、(:[])自体を関数と見なすことがポイント
前者として捉えると以下のようになってしまう
code:hs
(:) <$> Just 5 <*> Just []